/*
 * Bibliothèque graphique pour le développement d'interface riche. Il met à disposition des
 * outils pour créer des boites de dialogue, des fenetres et des formulaires rapidement.
 * Bibliothèque Window Simple Button. Gestion des boutons pour les formulaires.
 *
 * version 0.1
 * since 0.1
 *
 *    - Normalisation des commentaires et des méthodes.
 *    - Ajout de la méthode noFill()
 *    - Ajout de l'accesseur Enable()
 *    - Ajout de l'accesseur Text()
 *
 * date 28/10/2010
 * author Lenzotti Romain
 *
 * This work is licensed under a Creative Commons Attribution 2.5 Generic License
 * http://creativecommons.org/licenses/by/2.5/
 **/
 
/** section: Forms UI
 * class SimpleButton
 * Cette classe créer un bouton paramètrable avec une icone et un texte.
 **/
var SimpleButton = Class.createSprite('span');
SimpleButton.prototype = {
	__class__:'simplebutton',
	className:'simple-button',
	_enabled: true,
/**
 * new SimpleButton(options)
 * - options (Object): Objet de configuration.
 *
 * Créer une nouvelle instance du bouton.
 * 
 * #### Paramètre options
 *
 * * `icon` : Nom de l'icone à afficher. La liste des icones est mise à disposition par le fichier icons.css de l'application.
 * * `text` : Texte à afficher dans le bouton.
 * * `enabled`: Active ou desactive le bouton.
 * * `nofill`: Supprime les bordures et le fond du bouton.
 * * `type`: (Normal : style normal, Mini : petit bouton, Large : grand boutton)
 *
 **/
	initialize:function(obj){
		
		var options = {
			className: '',
			text: 	'',
			icon:	'',
			enable:	true,
			nofill:	false,
			type:	'normal'
		};
		
		if(!Object.isUndefined(obj)){
			Object.extend(options, obj);
		}
		
		this.Text = 	new Node('span', {className:'simple-button-notext'});
		this.Icon = 	new Node('span');

		this.appendChild(this.Icon);
		this.appendChild(this.Text);
		
	
		if(options.className != '') 	this.setClassName(options.className);
		if(options.text != '') 			this.setText(options.text);
		if(options.icon != '') 			this.setIcon(options.icon);
		if(!options.enable)     		this.Enable(options.enable);
		if(options.nofill)    			this.noFill();
		
		switch(options.type){
			default:
			case 'normal':break;
			case 'large':
				this.Large();
				break;
			case 'mini':
				this.Mini();
				break;
		}
		
	},
/**
 * SimpleButton.clear() ->  SimpleButton
 *
 * Vide le boutton.
 **/
	clear:function(){
		this.Text.innerHTML = 	'';
		this.Icon.className =   '';
		this.setIcon('');
		return this;
	},
/**
 * SimpleButton.noFill(bool) -> SimpleButton
 * - bool (Boolean): `true` les bordures et fond seront supprimés.
 *
 * Supprime le fond et les bordures de l'instance.
 **/
	noFill: function(bool){
		if(bool){
			this.setStyle('background:none; border-width:0px;');	
		}else{
			this.setStyle('border-width:1px;background:;');
		}
		return this;
	},
/**
 * SimpleButton.Mini() -> SimpleButton
 *
 * Cette méthode change le bouton en mini bouton.
 **/
 	Mini: function(){
		this.Normal();
		this.addClassName('mini-button');
	},
/**
 * SimpleButton.Large() -> SimpleButton
 *
 * Cette méthode change le bouton en un bouton large acceptant les icônes de 32x32.
 **/
 	Large: function(){
		this.Normal();
		this.addClassName('large-button');
	},
/**
 * SimpleButton.Normal() -> SimpleButton
 *
 * Cette méthode rétablie le style du bouton.
 **/
 	Normal: function(){
		this.removeClassName('mini-button');
		this.removeClassName('large-button');
	},
	//ignore
	remove:function(){
		this.clear();
	},
/**
 * SimpleButton.Enable(bool) -> SimpleButton
 * - bool (Boolean): Change l'etat du bouton. Si la valeur est `true` le bouton sera actif. Si le valeur est `false` le bouton sera désactivé.
 *
 * Active ou désactive le bouton.
 **/
	Enable: function(bool){
		if(bool){
			this._enabled = bool;
			this.setStyle('background: #CCC; color:#999;');	
			return this._enabled;	
		}
		this.setStyle('background:inherit; color:inherit;');
		
		return this._enabled = false;
	},
/**
 * SimpleButton.select() -> SimpleButton
 *
 * Le bouton apparaitra selectionné. 
 **/
	select: function(){
		this.removeClassName('simple-button-selected');
		this.addClassName('simple-button-selected');
		return this;
	},
/**
 * SimpleButton.unselect() -> SimpleButton
 *
 * Le bouton apparaitra non selectionné. 
 **/
	unselect: function(){
		this.removeClassName('simple-button-selected');
		return this;
	},
/** alias of: Event.observe
 * SimpleButton.observe(eventName, handler) -> void
 * - eventName (String): Nom de l'événement.
 * - handler (Function): Fonction associée à l'événement.
 *
 * Ajoute un écouteur `handler` sur un nom d'événement `eventName`.
 **/
 
/** alias of: Event.observe
 * SimpleButton.stopObserving(eventName, handler) -> void
 * - eventName (String): Nom de l'événement.
 * - handler (Function): Fonction associée à l'événement.
 *
 * Supprime un écouteur `handler` sur un nom d'événement `eventName`.
 **/
 
	observe: function(arg1, arg2, bool){
		Event.observe(this, arg1, function(evt){
			if(arg1 == 'click' || arg1 == 'mousedown' || arg1 == 'mouseup'){
				if(!this._enabled){
					return;
				}
			}
			arg2.call(this, evt);
			if(Object.isUndefined(bool)) Event.stop(evt);
		});
		return this;
	},

	setClassName: function(className){
		this.addClassName(className);
		return this;
	},
/**
 * SimpleButton.setIcon(icon) -> SimpleButton
 * - icon (String): Nom de l'icone. 
 *
 * Ajoute un nom d'icone qui apparaitra dans le bouton.
 *
 **/
	setIcon: function(icon){
		if(this.Text.innerHTML == '') this.Text.innerHTML = '';
		
		//réinitialisation des styles
		this.Icon.className = 	'simple-button-icon';
		this.removeClassName('icon-button');
		
		if(icon != ''){
			this.Icon.addClassName('icon-' + icon);
			this.addClassName('icon-button');
		}
		
		return this;
	},
	/**
	 * Ajoute du texte au bouton. 
	 * @param {String} txt Texte à ajouter.
	 * @returns {SimpleButton}
	 **/
	setText:function(txt){
		
		this.Text.className = '';
		
		if(txt == '' || Object.isUndefined(txt)){
			this.Text.addClassName('simple-button-notext');
			this.Text.innerHTML = '';
		}else{
			this.Text.addClassName('simple-button-text');
			this.Text.innerHTML = txt;
		}
		
		return this;
	},
	/**
	 * Retourne le texte du bouton.
	 * @returns {String}
	 */
	getText:function(){
		return this.Text.innerHTML;
	},
/**
 * SimpleButton.Text(text) -> String
 *
 * ##### Exemple d'utilisation
 * 
 * Affectation d'une valeur :
 * 
 *     var btn = new SimpleButton();
 *     btn.Text('mon text');
 *
 * Récupération d'une valeur :
 * 
 *     var btn = new SimpleButton({text:'mon text'});
 *     alert(btn.Text()); //mon text
 * 
 **/
	Text: function(text){
		if(!Object.isUndefined(text)){
			this.setText(text);
		}
		return this.getText();
	}
};